package cn.lg.soar.core.util;

import cn.lg.soar.common.util.data.DataUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.Feature;
import com.alibaba.fastjson.serializer.SerializerFeature;

import java.util.List;

/**
 * 用于系统内部序列化（如redis、数据库等不会有人为输入的场景，前端交互第三方接口交互不要使用）
 * @author luguoxiang 469599794@qq.com
 * @Date: 2024/1/24 22:20
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
public interface InnerSerializeUtils {

    /**
     * 序列化为字节数组
     * @param data 数据可为 null
     * @return 返回值不会为 null
     */
    static byte[] serializeToBytes(Object data) {
        return JSON.toJSONBytes(data, SerializerFeature.WriteClassName);
    }

    /**
     * 序列化为json
     * @param data 数据可为 null
     * @return 返回值不会为 null
     */
    static String serializeToJson(Object data) {
        return JSON.toJSONString(data, SerializerFeature.WriteClassName);
    }

    /**
     * 序列化为json
     * @param data 数据可为 null
     * @return 返回值不会为 null
     */
    static String serializeToBase64(Object data) {
        byte[] bytes = serializeToBytes(data);
        return DataUtil.byteToBase64(bytes);
    }

    /**
     * 反序列化字节数组
     * @param bytes 字节数组 null
     * @return
     */
    static Object deserializeByBytes(byte[] bytes) {
        if (bytes == null) {
            return null;
        }
        return JSON.parse(bytes, Feature.SupportAutoType);
    }

    /**
     * 反序列化json
     * @param json
     * @return
     */
    static Object deserializeByJson(String json) {
        if (json == null) {
            return null;
        }
        return JSON.parse(json, Feature.SupportAutoType);
    }

    /**
     * 反序列化base64
     * @param base64
     * @return
     */
    static Object deserializeByBase64(String base64) {
        if (base64 == null) {
            return null;
        }
        byte[] bytes = DataUtil.base64ToByte(base64);
        return JSON.parse(bytes, Feature.SupportAutoType);
    }

    static String toJson(Object data) {
        return JSON.toJSONString(data);
    }

    static JSONObject parseObject(String json) {
        return JSON.parseObject(json);
    }

    static JSONArray parseArray(String json) {
        return JSON.parseArray(json);
    }

    static <T>T parseObject(String json, Class<T> tClass) {
        return JSON.parseObject(json, tClass);
    }

    static <T> List<T> parseArray(String json, Class<T> tClass) {
        return JSON.parseArray(json, tClass);
    }

}
